#!/usr/bin/env python3

import pytest

from helpers.client import QueryRuntimeException
from helpers.cluster import ClickHouseCluster

cluster = ClickHouseCluster(__file__)
node1 = cluster.add_instance("node1", with_zookeeper=True)
node2 = cluster.add_instance("node2", with_zookeeper=True)


@pytest.fixture(scope="module")
def start_cluster():
    try:
        cluster.start()

        yield cluster

    finally:
        cluster.shutdown()


def get_data_files_for_table(node, table_name):
    data_path = node.query(
        f"SELECT arrayElement(data_paths, 1) FROM system.tables WHERE database='default' AND name='{table_name}'"
    ).strip()

    raw_output = node.exec_in_container(["bash", "-c", f"ls {data_path}"])
    return raw_output.strip().split("\n")


def test_empty_parts_optimize(start_cluster):
    for n, node in enumerate([node1, node2]):
        node.query("DROP TABLE IF EXISTS empty SYNC")
        node.query(
            """
            CREATE TABLE empty (key UInt32, val UInt32, date Datetime)
            ENGINE=ReplicatedSummingMergeTree('/clickhouse/01560_optimize_on_insert', '{}', val)
            PARTITION BY date ORDER BY key;
        """.format(
                n + 1
            )
        )

    node1.query(
        "INSERT INTO empty VALUES (1, 1, '2020-01-01'), (1, 1, '2020-01-01'), (1, -2, '2020-01-01')"
    )

    node2.query("SYSTEM SYNC REPLICA empty", timeout=15)

    assert node1.query("SELECT * FROM empty") == ""
    assert node2.query("SELECT * FROM empty") == ""

    # No other tmp files exists
    assert set(get_data_files_for_table(node1, "empty")) == {
        "detached",
        "format_version.txt",
    }
    assert set(get_data_files_for_table(node2, "empty")) == {
        "detached",
        "format_version.txt",
    }

    node1.query(
        "INSERT INTO empty VALUES (1, 1, '2020-02-01'), (1, 1, '2020-02-01'), (1, -2, '2020-02-01')",
        settings={"insert_quorum": 2},
    )

    assert node1.query("SELECT * FROM empty") == ""
    assert node2.query("SELECT * FROM empty") == ""

    for node in [node1, node2]:
        node.query("DROP TABLE IF EXISTS empty SYNC")
